/**
 *                        .::::.
 *                      .::::::::.
 *                     :::::::::::
 *                  ..:::::::::::'
 *               '::::::::::::'
 *                 .::::::::::
 *            '::::::::::::::..
 *                 ..::::::::::::.
 *               ``::::::::::::::::
 *                ::::``:::::::::'        .:::.
 *               ::::'   ':::::'       .::::::::.
 *             .::::'      ::::     .:::::::'::::.
 *            .:::'       :::::  .:::::::::' ':::::.
 *           .::'        :::::.:::::::::'      ':::::.
 *          .::'         ::::::::::::::'         ``::::.
 *      ...:::           ::::::::::::'              ``::.
 *     ````':.          ':::::::::'                  ::::..
 *                        '.:::::'                    ':'````..
 * 
 * ----------------------
 * |
 * |  常用工具类
 * |
 * ----------------------
 */
/**
 * title: w_html-utils.js v1.0.0
 * author: Mr.W 
 * time: 2018.12.10
 * describe: 工具类,基本jq开发,只有变量,方法和执行的事件——方法也只有封装好以后的方法除了html、body标签意外不会包含其他的标签，id，class，需要执行的事件也是全局的，可以是和项目不相干的事件
 */
/**
 * JavaScript 数据类型
 * 值类型(基本类型)：字符串（String）、数字(Number)、布尔(Boolean)、对空（Null）、未定义（Undefined）、Symbol。
 * 引用数据类型：对象(Object)、数组(Array)、函数(Function)。
 */
var wObj_utils = {
  /**
   * 变量
   */
  wVar_txtD: '变量集——用于内部方法的使用',
  wVar: {
    // 是否可以点击，0：不可以，1：可以,默认是1
    isClick: 1,
  },
  /**
   * 常用正则检测
   * @params string:检测的字符串
   * @return boolean:判断是否满足正则表达式的条件
   */
  wRegexp_txtD: '常用正则检测',
  wRegexp: {
    // 手机号
    phone: function (str) {
      if (!(/^1\d{10}$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },
    // 邮箱
    email: function (str) {
      if (!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },
    // 纯数字
    allNumber: function (str) {
      if (!(/^[0-9]*$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },
    // 正数 - (大于等于0的整数或小数)
    positiveNumber: function (str) {
      if (!(/^(0|[1-9][0-9]*)(\.\d+)?$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },
    // 金额
    price: function (str) {
      if (!(/((^[1-9]\d*)|^0)(\.\d{1,2}){0,1}$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },
    // 中文字符
    character: function (str) {
      if (!(/^([\u4e00-\u9fa5])$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },
    // 身份证号
    IDCard: function (str) {
      if (!(/^\d{15}|\d{18}$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },
    // 用户名 - (字母开头,4-16位,允许字母数字和下划线)
    username: function (str) {
      if (!(/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },
    // 密码 - (6-18位,只允许字母数字和下划线)
    password: function (str) {
      if (!(/^[a-zA-Z0-9_]{6,18}$/.test(str))) {
        return false;
      } else {
        return true;
      }
    },

  },
  /**********************************以下通过第二个字符排序**********************************/
  /***A***/
  /**
   * 根据年月日计算年龄
   * @params string:出生年月日(新历，格式1995-08-20)
   * @return number:年龄
   */
  wAge_txtD: '根据年月日计算年龄,wP_birthday出生年月日(新历，格式1995-08-20)',
  wAge: function (wP_birthday) {
    if (!wP_birthday) {
      console.log('出生年月日为空！');
      return 0;
    }
    var r = wP_birthday.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
    if (r == null) return false;
    var d = new Date(r[1], r[3] - 1, r[4]);
    if (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]) {
      var Y = new Date().getFullYear();
      var M = new Date().getMonth() + 1;
      var D = new Date().getDate();
      var age = 0;
      if (r[1] < Y) {
        age = Y - r[1];
        if (r[3] < M) {
        } else if (r[3] == M) {
          if (r[4] < D) {
          } else if (r[4] == D) {
          } else {
            age = age - 1;
          }
        } else {
          age = age - 1;
        }
      } else {
        age = 0;
      }
      return (age);
    } else {
      console.log("出生年月日日期格式错误！格式如下1995-08-20");
      return 0;
    }
  },
  /***B***/
  /***C***/
  /**
   * 根据生日的月份和日期，计算星座
   * @params number:生日的月份,number:生日的日期
   * @return string:星座
   */
  wConstellatory_txtD: '根据生日的月份和日期，计算星座',
  wConstellatory: function (wP_m, wP_d) {
    if (!(wP_m && wP_d)) {
      console.log('请输入生日的月份和日期');
      return false;
    }
    wP_m = parseFloat(wP_m);
    wP_d = parseFloat(wP_d);
    if (!wObj_utils.wRegexp.allNumber.test(wP_m)) {
      console.log('生日的月份输入不正确');
      return false;
    } else {
      if (wP_m >= 1 || wP_m <= 12) {
        wP_m = parseInt(wP_m);
      } else {
        console.log('生日的月份输入不正确');
        return false;
      }
    }
    if (!wObj_utils.wRegexp.allNumber.test(wP_d)) {
      console.log('生日的日期输入不正确');
      return false;
    } else {
      if (wP_d >= 1 || wP_d <= 31) {
        wP_d = parseInt(wP_d);
      } else {
        console.log('生日的日期输入不正确');
        return false;
      }
    }
    return "魔羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手魔羯".substr(wP_m * 2 - (wP_d < "102223444433".charAt(wP_m - 1) - -19) * 2, 2);
  },
  /**
   * 不可以多次点击
   * @params function:回调函数,number:间隔时间(正整数,单位秒)
   * @return void
   */
  wClickMore_txtD: '阻止多次点击,参数1:回调函数,参数2:间隔时间，默认一秒',
  wClickMore: function (wP_callback, wP_time) {
    // 对回调函数做判断
    var isFunction = wObj_utils.wIsFunction(wP_callback);
    if (!isFunction) {
      console.log('wClickMore-方法中参数1不是一个函数方法');
      return false;
    }
    // 对间隔时间做判断
    wObj_utils.wRegexp.allNumber(parseInt(wP_time)) ? wP_time = parseInt(wP_time) : wP_time = 1;
    // 判断是否可以点击
    if (wObj_utils.wVar.isClick == 1) {
      wP_callback();
      wObj_utils.wVar.isClick = 0;
      var setT = setTimeout(function () {
        wObj_utils.wVar.isClick = 1;
        clearTimeout(setT);
      }, wP_time * 1000);
    } else {
      console.log('暂时不能点击！请稍后再试');
    }
  },
  /***D***/
  /***E***/
  /***F***/
  /***G***/
  /***H***/
  /***I***/
  /**
   * 判断是否是一个方法
   * @params function:需要验证的函数
   * @return boolean:true是一个函数，false不是一个函数
   */
  wIsFunction_txtD: '判断是否是一个方法',
  wIsFunction: function (wP_callback) {
    if (!wP_callback || typeof wP_callback == 'undefined' || wP_callback == undefined) {
      return false;
    } else {
      return true;
    }
  },
  /***J***/
  /***K***/
  /***L***/
  /***M***/
  /**
   * msg提示层弹框
   * @params string:wP_msg提示内容，number:wP_time提示显示的时间(默认2.5s，单位s)
   * @return void
   */
  wMsg_txtD: 'msg提示层弹框',
  wMsg(wP_msg, wP_time) {
    wP_time ? wP_time = parseFloat(wP_time) * 1000 : wP_time = 2500;
    var node_msg = '<div id="wMsg" style="position: fixed;min-width: 100px;z-index: 99999999;max-width: 98%;top: 50%;left: 50%;background-color: rgba(0, 0, 0, 0.6);padding: 15px 25px;box-sizing: border-box;color: #ffffff;border: none;text-align: center;box-shadow: none;border-radius: 2px;line-height: 18px;word-break: break-all;overflow: hidden;font-size: 14px;-webkit-transform: translate(-50%, -50%);-moz-transform: translate(-50%, -50%);-ms-transform: translate(-50%, -50%);-o-transform: translate(-50%, -50%);transform: translate(-50%, -50%);-webkit-transition: all 0.3s;-moz-transition: all 0.3s;-ms-transition: all 0.3s;-o-transition: all 0.3s;transition: all 0.3s;opacity: 0;opacity: 0.000001;"></div>';
    $('body').append(node_msg);
    $('#wMsg').text(wP_msg);
    $('#wMsg').animate({ opacity: 1 }, 300);
    var setT01 = setTimeout(function () {
      $('#wMsg').animate({ opacity: 0 }, 300);
      var setT02 = setTimeout(function () {
        $('#wMsg').remove();
        clearTimeout(setT01);
        clearTimeout(setT02);
      }, 1000);
    }, wP_time);
  },
  /***N***/
  /***O***/
  /***P***/
  /**
   * 页面返回顶部
   * @params void
   * @return void
   */
  wPageScrollTop_txtD: 'html,body滚动条返回顶部',
  wPageScrollTop: function () {
    $("html,body").animate({
      scrollTop: '0px'
    }, 500);
  },
  /**
   * 页面是否可以滚动
   * @params boolean:判断条件true或false
   * @return void
   */
  wPageIsScroll_txtD: '页面是否可以滚动,wP_bool 参数为真值时，则执行打开滚动条，反之，执行关闭滚动条',
  wPageIsScroll: function (wP_bool) {

    if (wP_bool) {
      // 返回滚动条
      // 方法一
      // $(document).unbind("scroll");
      // 方法二
      document.documentElement.style.overflowY = 'scroll';
    } else {
      // 关闭滚动条
      // 方法一
      // var tops = $(document).scrollTop();//当页面滚动时，把当前距离赋值给页面，这样保持页面滚动条不动
      // $(document).bind("scroll", function () { $(document).scrollTop(tops); });
      // 方法二
      document.documentElement.style.overflowY = 'hidden';
    }
  },
  /**
   * js阻止默认行为
   * @params object:参数e/event
   * @return void
   */
  wPreventDefault_txtD: 'js阻止默认行为(兼容性写法),wP_e 值参数e/event',
  wPreventDefault: function (wP_e) {
    //在触发该事件的时候，系统会给传给你这个参数，他包含了触发该事件的一些信息
    //这里e指代event
    var event = wP_e || window.wP_e;  //兼容火狐
    if (event.preventDefault) {
      event.preventDefault(); //标准浏览器
      console.log('preventDefault');
    } else {
      event.returnValue == false; //老ie
    }
  },
  /**
   * 用js取wP_m-wP_n的随机整数,wP_m-wP_n 之间的随机数，默认0-100（包括0和100）
   * @params number:wP_m值(默认0),number:wP_n值(默认100),number:wP_k值(默认代表包括wP_m和wP_n值，wP_k=1代表包括wP_m值不包括wP_n值，wP_k=2代表包括wP_m和wP_n值，wP_k=3代表不包括wP_m值包括wP_n值)
   * @return number:随机的整数
   */
  wRandomInteger_txtD: '用js取wP_m-wP_n的随机整数,wP_m-wP_n 之间的随机数,包括wP_m(第一个参数最小值)和wP_n(第二个参数最大值)值,第三个参数没有代表包括wP_m和wP_n值，wP_k=1代表包括wP_m值不包括wP_n值，wP_k=2代表包括wP_m和wP_n值，wP_k=3代表不包括wP_m值包括wP_n值',
  wRandomInteger: function (wP_m, wP_n, wP_k) {
    /**
     * 用js取m-n的随机整数
     * m-n 之间的随机数,包括m和n值
     * Math.floor()向下取整
     * Math.round()四舍五入
     * Math.ceil() 向上取整
     */
    if (!wP_m) {
      console.log('随机整数默认最小值：0');
      wP_m = 0;
    }
    if (!wP_n) {
      console.log('随机整数默认最大值：100');
      wP_n = 100;
    }
    var num = wP_m;
    switch (wP_k) {
      case 1:
        num = Math.floor(Math.random() * (wP_m - wP_n) + wP_n);
        break;
      case 2:
        num = Math.round(Math.random() * (wP_m - wP_n) + wP_n);
        break;
      case 3:
        num = Math.ceil(Math.random() * (wP_m - wP_n) + wP_n);
        break;
      default:
        num = Math.round(Math.random() * (wP_m - wP_n) + wP_n);
    }
    return num;
  },
  /***Q***/
  /***R***/
  /***S***/
  /**
   * 获取设备系统的信息
   * @params void
   * @return object:设备系统的信息
   */
  wSystemInfo_txtD: '获取设备系统的信息',
  wSystemInfo: function () {
    // 系统信息
    var systemInfo = {};

    // equipmentCode用于判断设备 equipmentCode=0表示是电脑,1代表ipad,2代表iPhone,3代表Android
    var equipmentCode = 0;
    var equipment = 'PC';
    var ua = navigator.userAgent.toLowerCase();
    var Android = String(ua.match(/android/i)) == "android";
    var iPad = String(ua.match(/ipad/i)) == "ipad";
    var iPhone = String(ua.match(/iphone/i)) == "iphone";
    if (Android) {
      //Android
      equipmentCode = 3;
      equipment = 'Android';
    } else if (iPhone) {
      //iPhone
      equipmentCode = 2;
      equipment = 'iPhone';
    } else if (iPad) {
      //iPad
      equipmentCode = 1;
      equipment = 'iPad';
    } else {
      //pc
      equipmentCode = 0;
      equipment = 'PC';
    }
    systemInfo.equipment_txtD = 'equipmentCode用于判断设备 equipmentCode=0表示是电脑,1代表ipad,2代表iPhone,3代表Android';
    systemInfo.equipmentCode = equipmentCode;
    systemInfo.equipment = equipment;

    // 获取系统设备的width和height
    systemInfo.width = document.documentElement.clientWidth || document.body.clientWidth;
    systemInfo.height = document.documentElement.clientHeight || document.body.clientHeight;

    // 返回值
    return systemInfo;
  },
  /**
   * js阻止取消冒泡
   * @params object:参数e/event
   * @return void
   */
  wStopPropagation_txtD: 'js阻止取消冒泡(兼容性写法),wP_e 值参数e/event',
  wStopPropagation: function (wP_e) {
    //在触发该事件的时候，系统会给传给你这个参数，他包含了触发该事件的一些信息
    //这里e指代event
    var event = wP_e || window.wP_e;  //兼容火狐
    if (event.stopPropagation) {
      event.stopPropagation();  //标准浏览器
    } else {
      event.cancaleBubble == true;  //老ie
    }
  },
  /***T***/
  /***U***/
  /**
   * js获取url后面的参数集合
   * @params void
   * @return object:url后面的参数集合,是按照老式的？与&分割的
   */
  wUrlPara_txtD: 'js获取url后面的参数集合,是按照老式的？与&分割的',
  wUrlPara: function () {
    var url = location.search; //获取url中"?"符后的字串
    var theURLPara = new Object();
    if (url.indexOf("?") != -1) {
      var str = url.substr(1);
      strs = str.split("&");
      for (var i = 0; i < strs.length; i++) {
        theURLPara[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
      }
    }
    return theURLPara;
  },
  /***V***/
  /**
   * 验证码倒计时
   * @params object:倒计时显示节点，number:倒计时的时间，默认值为60，单位秒(s)
   * @return boolean: 
   */
  wVerificationCountDown_txtD: '验证码倒计时,wP_node参数是倒计时节点,wP_time参数是倒计时的时间，默认值为60，单位秒(s)',
  wVerificationCountDown: function (wP_node, wP_time) {
    // 用户限制用户不能重复点击
    if ($(wP_node).hasClass('_wCountDown')) {
      console.log('请不要重复点击！');
      return false;
    } else {
      $(wP_node).addClass('_wCountDown');
    }
    if (!wP_node) {
      console.log('验证码倒计时方法传递的标签节点不存在！');
      return false;
    }
    if (!wP_time) {
      console.log('验证码倒计时方法默认倒计时的时间60秒');
      wP_time = 60;
    }
    var wHtml = $(wP_node).html();
    var wCD_second = wP_time;
    $(wP_node).html(wCD_second + 's');
    var setIn = setInterval(function () {
      if (wCD_second == 0) {
        $(wP_node).html(wHtml);
        $(wP_node).removeClass('_wCountDown');
        clearInterval(setIn);
        return true;
      } else {
        wCD_second--;
        $(wP_node).html(wCD_second + 's');
      }
    }, 1000);;
  },
  /***W***/
  /***X***/
  /***Y***/
  /***Z***/

}

